package com.bestcem.xm.member.service;

import com.bestcem.xm.common.core.domain.web.ServiceResult;
import com.bestcem.xm.member.controller.param.group.CreateGroupParam;
import com.bestcem.xm.member.controller.param.group.UpdateGroupParam;
import com.bestcem.xm.member.controller.vo.CreateGroupVO;
import com.bestcem.xm.member.controller.vo.DeleteGroupVO;
import com.bestcem.xm.member.controller.vo.ListGroupVO;
import com.bestcem.xm.member.controller.vo.UpdateGroupVO;
import com.bestcem.xm.member.mq.message.GroupDeletedMessage;
import com.bestcem.xm.member.mq.message.GroupingMessage;
import com.bestcem.xm.member.mq.message.MemberCreationUpdMessage;

/**
 * 分组Service
 *
 * @author ympan <yuming.pan@idiaoyan.com>
 * @version v1.0
 * @date 16:23 2021/11/24
 */
public interface GroupService {

    /**
     * 创建分组
     *
     * @param param 创建分组参数
     * @param orgId 企业标识
     * @return 分组id
     * @author ympan <yuming.pan@idiaoyan.com>
     * @date 16:34 2021/11/24
     */
    ServiceResult<CreateGroupVO> createGroup(CreateGroupParam param, String orgId);

    /**
     * 更新分组
     *
     * @param id    分组标识
     * @param param 更新分组参数
     * @param orgId 企业标识
     * @return 被更新的分组id
     * @author ympan <yuming.pan@idiaoyan.com>
     * @date 11:50 2021/11/25
     */
    ServiceResult<UpdateGroupVO> updateGroup(String id, UpdateGroupParam param, String orgId);

    /**
     * 查询分组列表
     *
     * @param orgId 公司id
     * @return 分组列表
     * @author ympan <yuming.pan@idiaoyan.com>
     * @date 17:07 2021/11/25
     */
    ServiceResult<ListGroupVO> listGroup(String orgId, String userId, Integer superAdmin, Integer seniorAdmin);

    /**
     * 根据id删除分组，再根据orgId从联系人的分组列表字段将该分组删除
     *
     * @param id    分组id
     * @param orgId 公司id
     * @return 删除数量
     * @author ympan <yuming.pan@idiaoyan.com>
     * @date 10:34 2021/11/26
     */
    ServiceResult<DeleteGroupVO> deleteGroup(String id, String orgId);

    /**
     * 发送因联系人创建/更新继而为此联系人分组的消息
     *
     * @param orgId          公司标识
     * @param memberId       联系人标识
     * @param groupSyncToken 单个联系人分组token
     * @return 发送成功与否
     * @author ympan <yuming.pan@idiaoyan.com>
     * @date 16:50 2021/11/30
     */
    ServiceResult<Void> sendMemberCreationUpdMessage(String orgId, String memberId, String groupSyncToken);

    /**
     * 发送因分组规则修改的消息
     *
     * @param orgId   公司标识
     * @param groupId 分组标识
     * @param uuid    分组令牌
     * @param seq     含义同分组标识
     * @return 发送成功与否
     * @author ympan <yuming.pan@idiaoyan.com>
     * @date 16:44 2021/11/30
     */
    ServiceResult<Void> sendGroupMessage(String orgId, String groupId, String uuid, Long seq);

    /**
     * 发送为该组织下所有联系人分组的消息
     *
     * @param orgId 公司标识
     * @return 发送成功与否
     * @author ympan <yuming.pan@idiaoyan.com>
     * @date 16:44 2021/11/30
     */
    ServiceResult<Void> sendGroupMessages(String orgId);

    /**
     * 联系人创建、联系人更新-调度至分组
     *
     * @param memberCreationUpdMessage 联系人创建、联系人更新-调度至分组参数
     * @return 成功与否
     * @author ympan <yuming.pan@idiaoyan.com>
     * @date 22:54 2021/11/29
     */
    ServiceResult<Void> groupMember(MemberCreationUpdMessage memberCreationUpdMessage);

    /**
     * 分批修改联系人，按时间分批
     *
     * @param groupingMessage 联系人分组参数
     * @return 成功与否
     * @author ympan <yuming.pan@idiaoyan.com>
     * @date 11:25 2021/11/29
     */
    ServiceResult<Void> groupMembers(GroupingMessage groupingMessage);

    /**
     * 分批修改联系人的groups，按时间分批
     *
     * @param groupDeletedMessage 分组删除消息
     * @return 成功与否
     * @author ympan <yuming.pan@idiaoyan.com>
     * @date 20:36 2021/12/22
     */
    ServiceResult<Void> updateMemberGroups(GroupDeletedMessage groupDeletedMessage);
}
